package com.xs.tool.common.reg;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.swing.plaf.PanelUI;

/**
 * 正则表达式验证
 * @author xs
 * @date 202011251456
 */
public class RegUtil {
  /**
   * ^ 匹配输入字符串开始的位置
   * \d 匹配一个或多个数字，其中 \ 要转义，所以是 \\d
   * $ 匹配输入字符串结尾的位置
   */
  private static final Pattern HK_PATTERN = Pattern.compile("^(5|6|8|9)\\d{7}$");
  private static final Pattern CHINA_PATTERN = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");
  private static final Pattern NUM_PATTERN = Pattern.compile("[0-9]+");
  /**
   1:只允许英文字母、数字、下划线、英文句号、以及中划线组成
   2:实例2、名称允许汉字、字母、数字，域名只允许英文域名
   */
  private static final Pattern REG_EMAIL1 = Pattern.compile("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$");
  private static final Pattern REG_EMAIL2 = Pattern.compile("^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$");
  /**
   * 大陆号码或香港号码均可
   */
  public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
    if(null == str || str.equals("")){
      return false;
    }
    return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
  }

  /**
   * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数
   * 此方法中前三位格式有：
   * 13+任意数
   * 145,147,149
   * 15+除4的任意数(不要写^4，这样的话字母也会被认为是正确的)
   * 166
   * 17+3,5,6,7,8
   * 18+任意数
   * 198,199
   */
  public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
    if(null == str || str.equals("")){
      return false;
    }
    Matcher m = CHINA_PATTERN.matcher(str);
    return m.matches();
  }

  /**
   * 香港手机号码8位数，5|6|8|9开头+7位任意数
   */
  public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
    if(null == str || str.equals("")){
      return false;
    }
    Matcher m = HK_PATTERN.matcher(str);
    return m.matches();
  }

  /**
   * 判断是否是正整数的方法
   */
  public static boolean isNumeric(String str) {
    if(null == str || str.equals("")){
      return false;
    }
    return NUM_PATTERN.matcher(str).matches();
  }

  /**
   * 是否是邮件
   * @param email 邮箱
   * @return
   */
  public static boolean isEmail(String email){
    if(null == email || email.equals("")){
      return false;
    }
    Matcher m1 = REG_EMAIL1.matcher(email);
    Matcher m2 = REG_EMAIL2.matcher(email);
    if(m1.matches() || m2.matches()){
      return true;
    }
    return false;
  }
}
